package com.sakiko.audiobook.search.config;

import io.netty.util.concurrent.DefaultThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.*;

/**
 * projectName: com.sakiko.audiobook.search.config
 *
 * @author: sakiko
 * time: 2025/9/21 23:55
 * description: 自定义线程池
 */
@Configuration
public class ThreadPoolExecutorConfig {

    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        // 自定义线程池！因为使用工具类 Executor的线程池容易出现 OOM内存溢出(阻塞队列 or 最大线程池默认个数是 Integer.MAX_VALUE)
        // 线程池的核心参数; 核心个数如何设置; 线程池的工作原理; 相关源码
        // 获取 系统 CPU核数
        int cpuCoreNum = Runtime.getRuntime().availableProcessors();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                cpuCoreNum, // 核心线程数
                cpuCoreNum * 2, // 最大线程数
                60, // 线程存活时间 KeepAliveTime
                TimeUnit.SECONDS, // 单位
                new LinkedBlockingQueue<>(1024), // 阻塞队列
                Executors.defaultThreadFactory(), // 默认线程工厂即可
                new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
        );
        // 返回线程池
        return threadPoolExecutor;
    }
}
